package com.example.basic01;

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

/**
 * 引用类型和原始类型具有不同的特征和用法，
 * 它们包括：大小和速度问题，这种类型以哪种类型的数据结构存储，
 * 当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。
 * 对象引用实例变量的缺省值为 null，而原始类型实例变量的缺省值与它们的类型有关
 */
@Slf4j
class Person {
    protected String name;
    private int age;
    private Integer integer;

    static {
        log.info("Person static block");
    }

    public static void staticM() {
        log.info("Person static method");
    }

    public Person() {
        log.info("no args,person");
    }

    public Person(String name) {
        log.info("person:{}", name);
        this.name = name;
    }

    // 引用自己的构造函数
    public Person(String name, int age) {
        this(name);
        this.age = age;
    }
}

@Getter
@Setter
@EqualsAndHashCode(callSuper = true)
@Slf4j
class Student extends Person {
    private String name;

    public Student() {
        log.info("no args,Student");
    }

    public static void staticM() {
        log.info("Person static method");
    }

    static {
        log.info("student static");
    }

    public Student(String name) {
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Student(String name, String name1) {
//        this();
//        super(name);
        this.name = name1;
    }

    public void getInfo() {
        log.info("father:{}", super.name);     //Father
        log.info("son:{}", this.name);     //Child
    }

}

/*
static
     1、修饰成员变量
     2、修饰成员方法
     3、静态代码块
     4、修饰类【只能修饰内部类也就是静态内部类】
     5、静态导包
 */
class Test {
    public static void main(String[] args) {
        // todo 这个位置是一道好题目 需要认真思考
        Person.staticM();
        Student.staticM();
        Student student = new Student("father", "son");
        student.getInfo();

    }
}